/**
 * 菜单栏组件模块
 * 负责处理顶部菜单栏的交互和功能
 */
class MenuBar {
  constructor(editorCore, fileManager) {
    this.editorCore = editorCore;
    this.fileManager = fileManager;
    this.menuBarElement = null;
    this.shortcuts = new Map();
  }

  /**
   * 初始化菜单栏
   */
  init() {
    this.menuBarElement = document.getElementById('menu-bar');
    if (!this.menuBarElement) {
      console.error('菜单栏元素未找到');
      return;
    }

    this.bindEvents();
    this.setupKeyboardShortcuts();
    console.log('菜单栏初始化完成');
  }

  /**
   * 绑定事件监听器
   */
  bindEvents() {
    console.log('绑定菜单栏事件监听器');
    
    // 为每个菜单项单独绑定事件
    const menuItems = this.menuBarElement.querySelectorAll('.menu-item');
    console.log('找到菜单项数量:', menuItems.length);
    
    menuItems.forEach(item => {
      const action = item.getAttribute('data-action');
      console.log('为菜单项绑定事件:', action);
      
      item.addEventListener('click', (event) => {
        event.preventDefault();
        event.stopPropagation();
        console.log('菜单项被点击:', action);
        
        if (action) {
          this.handleMenuAction(action);
        } else {
          console.warn('菜单项没有 data-action 属性');
        }
      });
    });
    
    // 保留原有的事件委托作为备用
    this.menuBarElement.addEventListener('click', (event) => {
      console.log('菜单栏点击事件触发', event.target);
      
      const menuItem = event.target.closest('.menu-item');
      if (menuItem) {
        console.log('找到菜单项:', menuItem);
        const action = menuItem.getAttribute('data-action');
        console.log('菜单动作:', action);
        
        if (action) {
          this.handleMenuAction(action);
        } else {
          console.warn('菜单项没有 data-action 属性');
        }
      } else {
        console.log('点击的不是菜单项');
      }
    });
  }

  /**
   * 设置键盘快捷键
   */
  setupKeyboardShortcuts() {
    // 定义快捷键映射
    this.shortcuts.set('ctrl+n', 'new');
    this.shortcuts.set('cmd+n', 'new');
    this.shortcuts.set('ctrl+o', 'open');
    this.shortcuts.set('cmd+o', 'open');
    this.shortcuts.set('ctrl+s', 'save');
    this.shortcuts.set('cmd+s', 'save');
    this.shortcuts.set('ctrl+shift+s', 'save-as');
    this.shortcuts.set('cmd+shift+s', 'save-as');
    this.shortcuts.set('ctrl+z', 'undo');
    this.shortcuts.set('cmd+z', 'undo');
    this.shortcuts.set('ctrl+y', 'redo');
    this.shortcuts.set('cmd+y', 'redo');
    this.shortcuts.set('ctrl+shift+z', 'redo');
    this.shortcuts.set('cmd+shift+z', 'redo');

    // 绑定键盘事件
    document.addEventListener('keydown', (event) => {
      const key = this.getKeyCombo(event);
      const action = this.shortcuts.get(key);
      if (action) {
        event.preventDefault();
        this.handleMenuAction(action);
      }
    });
  }

  /**
   * 获取按键组合字符串
   * @param {KeyboardEvent} event - 键盘事件
   * @returns {string} 按键组合字符串
   */
  getKeyCombo(event) {
    const parts = [];
    
    if (event.ctrlKey) parts.push('ctrl');
    if (event.metaKey) parts.push('cmd');
    if (event.shiftKey) parts.push('shift');
    if (event.altKey) parts.push('alt');
    
    parts.push(event.key.toLowerCase());
    
    return parts.join('+');
  }

  /**
   * 处理菜单动作
   * @param {string} action - 动作类型
   */
  async handleMenuAction(action) {
    console.log('菜单动作被触发:', action);
    
    try {
      switch (action) {
        case 'new':
          console.log('执行新建操作');
          await this.handleNew();
          break;
        case 'open':
          await this.handleOpen();
          break;
        case 'save':
          await this.handleSave();
          break;
        case 'save-as':
          await this.handleSaveAs();
          break;
        case 'undo':
          this.handleUndo();
          break;
        case 'redo':
          this.handleRedo();
          break;
        case 'about':
          this.handleAbout();
          break;
        default:
          console.warn(`未知的菜单动作: ${action}`);
      }
    } catch (error) {
      console.error(`处理菜单动作 ${action} 时出错:`, error);
      this.showError(`操作失败: ${error.message}`);
    }
  }

  /**
   * 处理新建文档
   */
  async handleNew() {
    console.log('handleNew 被调用');
    
    try {
      if (this.editorCore && this.editorCore.hasUnsavedChanges()) {
        console.log('检测到未保存的更改');
        const shouldSave = await this.confirmSave('当前文档有未保存的更改，是否保存？');
        if (shouldSave === null) return; // 用户取消
        if (shouldSave) {
          await this.handleSave();
        }
      }
      
      console.log('清空编辑器内容');
      if (this.editorCore) {
        this.editorCore.clear();
      }
      
      console.log('更新标题');
      this.updateTitle('未命名文档');
      
      console.log('handleNew 完成');
    } catch (error) {
      console.error('handleNew 出错:', error);
      alert('新建文档失败: ' + error.message);
    }
  }

  /**
   * 处理打开文档
   */
  async handleOpen() {
    console.log('handleOpen 被调用');
    
    try {
      if (this.editorCore && this.editorCore.hasUnsavedChanges()) {
        const shouldSave = await this.confirmSave('当前文档有未保存的更改，是否保存？');
        if (shouldSave === null) return; // 用户取消
        if (shouldSave) {
          await this.handleSave();
        }
      }

      console.log('调用文件管理器打开文件');
       const result = await this.fileManager.openFile();
       console.log('文件打开结果:', result);
       
       if (result) {
         this.editorCore.setContent(result.content, 'html');
         this.editorCore.setCurrentFile(result.filePath);
         this.updateTitle(this.getFileName(result.filePath));
         console.log('文档已打开:', result.filePath);
       }
     } catch (error) {
       console.error('handleOpen 出错:', error);
       alert('打开文件失败: ' + error.message);
     }
   }

  /**
   * 处理保存文档
   */
  async handleSave() {
    console.log('handleSave 被调用');
    
    try {
      const currentFile = this.editorCore.getCurrentFile();
      console.log('当前文件:', currentFile);
      
      if (currentFile) {
        const content = this.editorCore.getContent('html');
        console.log('保存内容长度:', content.length);
        await this.fileManager.saveFile(currentFile, content);
        this.editorCore.markAsSaved();
        this.updateTitle(this.getFileName(currentFile));
        console.log('文档已保存:', currentFile);
      } else {
        console.log('没有当前文件，转到另存为');
        await this.handleSaveAs();
      }
    } catch (error) {
      console.error('handleSave 出错:', error);
      alert('保存文件失败: ' + error.message);
    }
  }

  /**
   * 处理另存为
   */
  async handleSaveAs() {
    console.log('handleSaveAs 被调用');
    
    try {
      const content = this.editorCore.getContent('html');
      console.log('另存为内容长度:', content.length);
      const result = await this.fileManager.saveFileAs(content);
      console.log('另存为结果:', result);
      
      if (result) {
        this.editorCore.setCurrentFile(result.filePath);
        this.editorCore.markAsSaved();
        this.updateTitle(this.getFileName(result.filePath));
        console.log('文档已另存为:', result.filePath);
      }
    } catch (error) {
      console.error('handleSaveAs 出错:', error);
      alert('另存为失败: ' + error.message);
    }
  }

  /**
   * 处理撤销
   */
  handleUndo() {
    this.editorCore.undo();
  }

  /**
   * 处理重做
   */
  handleRedo() {
    this.editorCore.redo();
  }

  /**
   * 处理关于对话框
   */
  async handleAbout() {
    const aboutInfo = `EditBook 富文本编辑器
版本: 1.0.0

一个基于 Tauri 和 Quill.js 的现代富文本编辑器

功能特性:
• 富文本编辑
• 文件操作 (新建、打开、保存)
• 撤销/重做
• 键盘快捷键支持
• 字数统计
• 光标位置显示

快捷键:
Ctrl/Cmd + N: 新建
Ctrl/Cmd + O: 打开
Ctrl/Cmd + S: 保存
Ctrl/Cmd + Shift + S: 另存为
Ctrl/Cmd + Z: 撤销
Ctrl/Cmd + Y: 重做`;
    
    try {
      // 使用 Tauri 2.x 的正确 API 调用方式
      await window.__TAURI_PLUGIN_DIALOG__.message(aboutInfo, {
        title: '关于 EditBook',
        kind: 'info'
      });
    } catch (error) {
      console.error('显示关于对话框失败:', error);
      alert(aboutInfo);
    }
  }

  /**
   * 确认保存对话框
   * @param {string} message - 提示消息
   * @returns {Promise<boolean|null>} true=保存, false=不保存, null=取消
   */
  async confirmSave(message) {
    try {
      // 使用 Tauri 2.x 的正确 API 调用方式
      const result = await window.__TAURI_PLUGIN_DIALOG__.confirm(message, {
        title: '确认',
        kind: 'warning'
      });
      return result;
    } catch (error) {
      console.error('确认对话框出错:', error);
      return false;
    }
  }

  /**
   * 显示错误消息
   * @param {string} message - 错误消息
   */
  async showError(message) {
    console.error(message);
    try {
      // 使用 Tauri 2.x 的正确 API 调用方式
      await window.__TAURI_PLUGIN_DIALOG__.message(message, {
        title: '错误',
        kind: 'error'
      });
    } catch (error) {
      console.error('显示错误对话框失败:', error);
      alert('错误: ' + message);
    }
  }

  /**
   * 更新窗口标题
   * @param {string} fileName - 文件名
   */
  updateTitle(fileName) {
    const title = `${fileName} - EditBook`;
    document.title = title;
  }

  /**
   * 从文件路径获取文件名
   * @param {string} filePath - 文件路径
   * @returns {string} 文件名
   */
  getFileName(filePath) {
    if (!filePath) return '未命名文档';
    return filePath.split(/[\\/]/).pop() || '未命名文档';
  }

  /**
   * 启用/禁用菜单项
   * @param {string} action - 动作类型
   * @param {boolean} enabled - 是否启用
   */
  setMenuItemEnabled(action, enabled) {
    const menuItem = this.menuBarElement.querySelector(`[data-action="${action}"]`);
    if (menuItem) {
      menuItem.disabled = !enabled;
      menuItem.classList.toggle('disabled', !enabled);
    }
  }

  /**
   * 更新菜单状态
   */
  updateMenuState() {
    const hasContent = this.editorCore.getLength() > 0;
    const hasFile = this.editorCore.getCurrentFile() !== null;
    
    // 根据编辑器状态更新菜单项
    this.setMenuItemEnabled('save', hasContent);
    this.setMenuItemEnabled('save-as', hasContent);
  }

  /**
   * 销毁菜单栏
   */
  destroy() {
    if (this.menuBarElement) {
      this.menuBarElement.removeEventListener('click', this.handleMenuAction);
    }
    this.shortcuts.clear();
  }
}

export default MenuBar;